package main;

import dbClass.Levantamientos;
import dbClass.Puntos;
import ewe.io.BufferedInputStream;
import ewe.io.File;
import ewe.io.FileInputStream;
import ewe.io.FileWriter;
import ewe.io.IOException;
import ewe.io.InputStreamReader;
import ewe.io.PrintWriter;
import ewe.util.Vector;
import ewesoft.xml.XMLDecoder;
import ewesoft.xml.XMLElement;
import ewesoft.xml.sax.SAXException;

public class AbrirGuardar {
	private Levantamientos proyecto;
	private String archivo;
	private String error;
	/**
	 * Asigna proyecto a esta clase
	 * @param le Proyecto
	 */
	public void setProyecto(Levantamientos le) {
		proyecto = le;
	}
	/**
	 * Regresa el proyecto (abierto)
	 * @return proyecto
	 */
	public Levantamientos getProyecto() {
		return proyecto;
	}
	/**
	 * Asigna el archivo para guardar/abrir
	 * @param arch
	 */
	public void setArchivo(String arch) {
		archivo = arch;
	}
	/**
	 * Si existe algun error aqui se obtienen
	 * @return Error
	 */
	public String getError() {
		return error;
	}
	/**
	 * 
	 * Abrir guardar un proyecto
	 *
	 */
	public AbrirGuardar() {
		proyecto = new Levantamientos();
		proyecto.puntos = new Vector();
		error="";
	}
	/**
	 * Carga un levantamiento desde XML
	 * @return Proyecto
	 */
	public Levantamientos CargarXML() {
		XMLDecoder xmlDecoder = new XMLDecoder();
		try {			
			xmlDecoder.parse(new InputStreamReader(new BufferedInputStream(new FileInputStream(archivo),1024)));
			proyecto=XML2Levantamiento(((XMLElement)xmlDecoder.document.subElements.get(0)));
			proyecto.puntos=XML2Puntos(((XMLElement)xmlDecoder.document.subElements.get(1)).subElements);			
		} catch (SAXException e) {						
			error+=e.toString();
		}
		catch (IOException e) {			
			error+=e.toString();
		}		
		proyecto.cont = proyecto.puntos.size();
		return proyecto;
	}
	private Levantamientos XML2Levantamiento(XMLElement xmlElement) {
		Levantamientos ret = new Levantamientos();			
		if(xmlElement.attributes!=null) {
			ret.nombre = (xmlElement.attributes.get("Nombre").value.toString());
			ret.propietario= (xmlElement.attributes.get("Propietario").value.toString());
			ret.ubicacion= (xmlElement.attributes.get("Ubicacion").value.toString());
			ret.levanto= (xmlElement.attributes.get("Levanto").value.toString());
			ret.reviso= (xmlElement.attributes.get("Reviso").value.toString());
			ret.nSuelo= (xmlElement.attributes.get("Suelo").value.toString());
			ret.tolerancia= Integer.valueOf(xmlElement.attributes.get("Tolerancia").value.toString()).intValue();
			ret.azimut_inicial =Integer.valueOf(xmlElement.attributes.get("AzimutInicial").value.toString()).intValue();
			ret.azirumbo =Integer.valueOf(xmlElement.attributes.get("AzimutRumbo").value.toString()).intValue();
		}	
		ret.descripcion = xmlElement.text;
		return ret;
	}
	private Vector XML2Puntos(Vector xmlVector) {
		Vector puntosVector = new Vector();
		Puntos xml2Puntos ;
		XMLElement xmlElement = new XMLElement();
		for(int i=0; i<xmlVector.size(); i++) {
			xmlElement =(XMLElement)xmlVector.get(i);
			xml2Puntos = new Puntos();
			if(xmlElement.attributes!=null) {
				xml2Puntos.estacion  = Integer.valueOf(xmlElement.attributes.get("id").value.toString()).intValue();
				xml2Puntos.angulo    = Double.valueOf(xmlElement.attributes.get("angulo").value.toString()).doubleValue();
				xml2Puntos.distancia = Double.valueOf(xmlElement.attributes.get("distancia").value.toString()).doubleValue();
				xml2Puntos.azimut1   = Double.valueOf(xmlElement.attributes.get("azimut").value.toString()).doubleValue();
				xml2Puntos.azimut2   = Double.valueOf(xmlElement.attributes.get("azimutinverso").value.toString()).doubleValue();							
			}
			xml2Puntos.descripcion = xmlElement.text;
			puntosVector.add(xml2Puntos);			
		}				
		return puntosVector;
	}
	private boolean escribirXML(String xml) {
		
		try {			
			PrintWriter salida = new PrintWriter(new FileWriter(new File(archivo)));
			salida.write(xml);			
		}
		catch(IOException e) {
			error+=e.toString();
			return false;
		}		
		return true;
	}
	/**
	 * Genera un XML a partir del proyecto
	 * @return true/false si se guardo
	 */
	public boolean Levantamiento2XML() {		
		Puntos p = new Puntos();
		String xml = "<GeoApp> \n" +
					 "	<DatosGenerales Nombre=\""+proyecto.nombre+
					 			"\" Propietario=\""+proyecto.propietario+
					 			"\" Ubicacion=\""+proyecto.ubicacion+
					 			"\" Suelo=\""+proyecto.nSuelo+
					 			"\" Brujula = \"1\" Tolerancia=\""+proyecto.tolerancia+
					 			"\" AzimutInicial=\""+proyecto.azimut_inicial+
					 			"\"  AzimutRumbo=\""+proyecto.azirumbo+
					 			"\"  Levanto=\""+proyecto.levanto+
					 			"\"  Reviso=\""+proyecto.reviso+
					 			"\" >"+
			 			proyecto.descripcion+"</DatosGenerales>\n"+
					 "	<EstacionesMedidas>\n";					 
		for(int i=0; i<proyecto.puntos.size(); i++)
		{
			p=(Puntos)proyecto.puntos.get(i);
				xml+="				<Estacion id=\""+(i+1)+
				                     "\" angulo=\""+p.angulo+
                 				     "\" distancia=\""+p.distancia+
                 				     "\" azimut=\""+p.azimut1+
                 				     "\" azimutinverso = \""+p.azimut2+"\" >"+
                 				     p.descripcion+"</Estacion>\n";
		}
				xml+="	</EstacionesMedidas>\n"+
					 "</GeoApp>\n";
		
		return(escribirXML(xml));
	}
}
